package com.example.hms.service.servicelmpl;

import com.example.hms.dao.UserDao;
import com.example.hms.entity.SystemLog;
import com.example.hms.entity.User;
import com.example.hms.service.SystemLogService;
import com.example.hms.service.UserService;
import com.example.hms.util.Result;
import com.example.hms.util.ResultSubmit;
import com.example.hms.util.TokenUtil;
import com.example.hms.util.UserResult;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 服务层
@Service
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public class UserServicelmpl implements UserService {
    @Resource
    UserDao userDao;

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Resource
    SystemLogService systemLogService;


    @Override
    public Result login(String userId, String userPassword, HttpServletRequest request) {
        try {
            // 查询用户信息
            User user = userDao.login(userId);
            if (user == null) {
                // 用户不存在的情况
                return ResultSubmit.error("登录失败，用户不存在。");
            } else if (userPassword.equals(user.getUserPassword())) {
                HttpSession session = request.getSession();
                session.setAttribute("userId", user.getUserId());
                session.setAttribute("userPassword", userPassword);
                session.setAttribute("userName", user.getUserName());
                session.setAttribute("roleName", user.getRoleName());
                Long time = System.currentTimeMillis();
                session.setAttribute("time", time);
                session.setAttribute("token", TokenUtil.getToken(
                        String.valueOf(user.getUserId()), user.getUserName(), user.getRoleName(), time));
                SystemLog systemLog = new SystemLog();
                systemLog.setUserId(user.getUserId());
                systemLog.setRoleName(user.getRoleName());
                systemLog.setCreateTime(format.format(new Date()));
                systemLog.setUseTableName("user");
                systemLog.setUseTableDataIdBefore(String.valueOf(user.getUserTableId()));
                systemLog.setUseTableDataIdAfter(String.valueOf(user.getUserTableId()));
                systemLog.setUseType("用户登录");
                systemLogService.insert(systemLog);
                // 返回登录成功结果
                return ResultSubmit.success(sweet(user));
            } else {
                // 用户密码错误的情况
                return ResultSubmit.error("登录失败，密码错误。");
            }
        } catch (Exception e) {
            // 捕获异常并记录日志（如果有日志框架如 logback 或 log4j 可替换为实际日志输出）
            e.printStackTrace();
            // 返回统一的错误信息给前端
            return ResultSubmit.error("登录过程中发生异常：" + e.getMessage());
        }
    }

    private UserResult sweet(User user) {
        // 创建一个新的UserResult对象，用于封装用户信息
        UserResult userResult = new UserResult();


        userResult.setUserId(user.getUserId());
        userResult.setUserName(user.getUserName());
        userResult.setRoleName(user.getRoleName());
        return userResult;
    }

    @Override
    public Result info(HttpServletRequest request) {
        HttpSession session = request.getSession();

//        session.getAttribute("userId");
//        session.getAttribute("userName");
//        session.getAttribute("roleName");
        // 1.Map是一个接口
//        Map<String,String> map = new HashMap<>();
//        // session.getAttribute("userId");
//        map.put("userId",session.getAttribute("userId").toString());
//        map.put("userName",session.getAttribute("userName").toString());
//        map.put("roleName",session.getAttribute("roleName").toString());
//        return ResultSubmit.success(map);

        // 2.包装类返回
        UserResult userResult = new UserResult();
        // 从session中获取userId，通过userId去数据库查询用户信息，更新session中的用户信息
        String userId1 = session.getAttribute("userId").toString();
        User user1 = userDao.login(userId1);
        // 将查询到的用户信息设置到UserResult对象中
        userResult.setUserId((Integer) user1.getUserId());
        userResult.setUserName(user1.getUserName());
        userResult.setRoleName(user1.getRoleName());


//        userResult.setUserId((Integer) session.getAttribute("userId"));
//        userResult.setUserName(session.getAttribute("userName").toString());
//        userResult.setRoleName(session.getAttribute("roleName").toString());
        // todo 系统记录（一定要记得完善）
        return ResultSubmit.success(userResult);
    }

    @Override
    public Result selectAllUser(String userId, String userName, String roleName) {
        List<User> select1 = userDao.selectAllUser(userId, userName, roleName);
        return ResultSubmit.success(select1);
    }

    /**
     * 重写插入方法，用于添加新用户并记录操作日志
     *
     * @param user    用户对象，包含用户的相关信息
     * @param request HTTP请求对象，用于获取会话属性
     * @return 返回结果对象，表示操作成功或失败
     */
    @Override
    public Result insert(User user, HttpServletRequest request) {
        // 使用当前时间的毫秒值作为用户ID，并取绝对值确保非负
        user.setUserId(Math.abs((int) System.currentTimeMillis()));
        // 默认设置用户角色ID为2
        user.setRoleId(2);
        // 设置用户删除状态为“未删除”
        user.setDelete_("未删除");
        // 设置用户创建时间
        user.setCreateTime(format.format(new Date()));
        // 调用UserDao的插入方法，获取插入结果
        int insert1 = userDao.insert(user);

        // todo 系统记录
        // 创建系统日志对象，用于记录用户操作
        SystemLog systemLog = new SystemLog();
        // 从会话中获取当前操作用户的ID和角色名称
        systemLog.setUserId((Integer) request.getSession().getAttribute("userId"));
        systemLog.setRoleName((String) request.getSession().getAttribute("roleName"));
        // 设置系统日志创建时间
        systemLog.setCreateTime(format.format(new Date()));
        // 记录操作的表名为"user"
        systemLog.setUseTableName("user");
        // 去除以下注释可以记录操作前的数据ID
        // systemLog.setUseTableDataIdBefore(String.valueOf(user.getUserTableId()));
        // 通过用户ID、用户名和角色名称查询用户，以获取操作后的数据ID
        User user1 = userDao.selectAllUser(String.valueOf(user.getUserId()), user.getUserName(), user.getRoleName()).get(0);
        // 记录操作后的数据ID
        systemLog.setUseTableDataIdAfter(String.valueOf(user1.getUserTableId()));
        // 设置操作类型为“用户新增”
        systemLog.setUseType("用户新增");
        // 调用系统日志服务的插入方法，记录本次操作
        systemLogService.insert(systemLog);

        // 判断用户插入操作是否成功
        if (insert1 == 0) {
            // 事务回滚(手动回滚)，确保数据一致性
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.error("添加失败");
        } else {
            return ResultSubmit.success("添加成功");
        }
    }


    // 修改
    @Override
    public Result update(User user, HttpServletRequest request) {
        // 逻辑删除原数据
        int update1 = userDao.update(user);
        // 修改传入数据中的基础信息，比如：删除标识、创建时间
        user.setCreateTime(format.format(new Date()));
        user.setDelete_("未删除");
        // 清除 userTalbeId
//        user.setUserTableId(0);
        // 插入新数据
        int insert1 = userDao.insert(user);
        // todo 系统记录
        // 创建系统日志对象，用于记录用户操作
        SystemLog systemLog = new SystemLog();
        systemLog.setUserId((Integer) request.getSession().getAttribute("userId"));
        systemLog.setRoleName((String) request.getSession().getAttribute("roleName"));
        systemLog.setCreateTime(format.format(new Date()));
        systemLog.setUseTableName("user");
        User user1 = userDao.selectAllUser(String.valueOf(user.getUserId()), user.getUserName(), user.getRoleName()).get(0);
        systemLog.setUseTableDataIdAfter(String.valueOf(user1.getUserTableId()));
        systemLog.setUseTableDataIdBefore(String.valueOf(user1.getUserTableId()));
        systemLog.setUseType("用户更新");
        systemLogService.insert(systemLog);

        // 根据删除方法、新增方法返回值判断逻辑删除整个功能是否执行成功
        if (update1 == 1 || insert1 == 1) {
            return ResultSubmit.success("修改成功");
        } else {
            // 事务回滚(手动回滚)
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            //不成功则返回报错并回滚
            return ResultSubmit.error("修改失败");
        }
    }


    // 删除
    // 前端传递参数仅为userId
    @Override
    public Result delete(String userId, HttpServletRequest request) {
        // 根据用户ID查询用户信息
        User user = userDao.login(userId);
        // 根据用户信息执行逻辑删除
        int delete1 = userDao.update(user);
        // todo 系统记录操作

        // 创建系统日志对象，用于记录用户操作
        SystemLog systemLog = new SystemLog();
        systemLog.setUserId((Integer) request.getSession().getAttribute("userId"));
        systemLog.setRoleName((String) request.getSession().getAttribute("roleName"));
        systemLog.setCreateTime(format.format(new Date()));
        systemLog.setUseTableName("user");
        systemLog.setUseTableDataIdBefore(String.valueOf(user.getUserTableId()));
        systemLog.setUseType("用户删除");
        systemLogService.insert(systemLog);
        // 根据删除方法、新增方法返回值判断逻辑删除整个功能是否执行成功
        if (delete1 == 1) {
            return ResultSubmit.success("删除成功");
        } else {
            // 事务回滚(手动回滚)
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            //不成功则返回报错并回滚
            return ResultSubmit.error("删除失败");
        }
        //不成功则返回报错并回滚
    }

}
